#ifndef __M_LOG_M__
#define __M_LOG_M__
#include "util.hpp"
#include "level.hpp"
#include "format.hpp"
#include "message.hpp"
#include "buffer.hpp"
#include <thread>
#include "logger.hpp"
#include "sink.hpp"
#include <assert.h>
#include <atomic>
#include <fstream>
#include <condition_variable>
#include <vector>
#include <cstdarg>
#include <mutex>
#include <unistd.h>

namespace log
{
    //1. 提供获取指定日志器的全局接口(避免用户操作单例对象)
    log::Logger::ptr getLogger(const std::string logger_name)
    {
        return log::LoggerManager::getInstance().getLogger(logger_name);
    }
    log::Logger::ptr rootLogger()
    {
        return log::LoggerManager::getInstance().rootLogger();
    }

    void addLogger(const log::Logger::ptr& logger)
    {
        return log::LoggerManager::getInstance().addLogger(logger);
    }

    //2. 使用宏函数对日志器的接口进行代理(代理模式)
    #define debug(fmt,...) debug(__FILE__,__LINE__,fmt,##__VA_ARGS__)
    #define info(fmt,...) info(__FILE__,__LINE__,fmt,##__VA_ARGS__)
    #define warn(fmt,...) warn(__FILE__,__LINE__,fmt,##__VA_ARGS__)
    #define error(fmt,...) error(__FILE__,__LINE__,fmt,##__VA_ARGS__)
    #define fatal(fmt,...) fatal(__FILE__,__LINE__,fmt,##__VA_ARGS__)
    //3. 提供宏函数,直接通过默认日志器进行日志的标准输出打印(不用获取日志器了)
    #define DEBUG(fmt,...) log::rootLogger()->debug(fmt,##__VA_ARGS__)
    #define INFO(fmt,...) log::rootLogger()->info(fmt,##__VA_ARGS__)
    #define WARN(fmt,...) log::rootLogger()->warn(fmt,##__VA_ARGS__)
    #define ERROR(fmt,...) log::rootLogger()->error(fmt,##__VA_ARGS__)
    #define FATAL(fmt,...) log::rootLogger()->fatal(fmt,##__VA_ARGS__)
}
#endif